package main

import (
	"fmt"
	"time"
)

/**
多协程并发资源竞争的问题
执行命令：go build -race main.go 检测数据竞争状态
提示内容：WARNING: DATA RACE

解决方法：
1、互斥锁，全局变量 通过加锁lock unlock的方法 达到线程安全
	lock syck.Mutex
	lock.Lock() 等待用完 lock.Unlock()
2、channel通道


*/

var (
	testMap = make(map[int]int, 10)
)

func testNum(num int) {
	res := 1
	for i := 1; i <= num; i++ {
		res *= i
	}
	testMap[num] = res // fatal error: concurrent map writes    致命错误：并发映射写入
}

func main() {

	start := time.Now()

	for i := 1; i < 2000; i++ {
		go testNum(i)
	}

	// 协程需要再mian方法之后完毕
	time.Sleep(time.Second * 5)
	for key, val := range testMap {
		fmt.Printf("数字%v 对象的阶乘是 %v\n", key, val)

	}

	end := time.Since(start)
	fmt.Println(end)

}
